package com.library.books.service;

import java.util.List;
import com.baomidou.mybatisplus.extension.service.IService;
import com.library.books.domain.BooksBorrow;
import com.library.books.domain.dto.BooksBorrowOverdueDto;
import com.library.books.domain.vo.BooksJoinBorrowActive;
import com.library.books.domain.vo.BorrowJoinBooksMultiInfo;
import com.library.books.domain.vo.BorrowJoinBooksMultiInfo;
import com.library.books.domain.vo.borrow.BooksJoinBorrowRecord;

/**
 * 借阅Service接口
 *
 * @author hb
 * @date 2024-10-14
 */
public interface IBooksBorrowService extends IService<BooksBorrow>
{

    /**
     * 查询借阅列表
     *
     * @param booksBorrow 借阅
     * @return 借阅集合
     */
    List<BooksBorrow> selectBooksBorrowList(BooksBorrow booksBorrow);

    /**
     * 借阅功能
     *
     * @param booksBorrowList 借阅集合
     * @return 借阅集合
     */
    boolean borrowingFunction(List<BooksJoinBorrowRecord> booksBorrowList);

    /**
     * 根据RFID查询借阅记录列表
     *
     * @param rfid rfid集合
     * @return 借阅集合
     */
    List<BooksJoinBorrowRecord> selectBooksBorrowListByRfid(List<String> rfid);

    /**
     * 根据借阅id查询书籍等信息
     *  - 书籍信息（主要）
     *  - 规则信息
     *  - 书架信息
     *  - 产生的记录信息（主要）
     */
    BorrowJoinBooksMultiInfo selectBorrowJoinBooksMultiInfoByBorrowId(Long borrowId);

    /**
     * 根据索书号查询借阅记录列表
     *  - 小索书号 A123
     *
     * @param license 索书号
     * @return 借阅集合
     */
    BooksJoinBorrowRecord selectBooksBorrowListByLicense(String license);

    /**
     * 根据rfid查询可借阅书籍记录列表
     *
     * @param rfid rfid集合
     * @return 借阅集合
     */
    List<BooksJoinBorrowActive> selectBooksActiveBorrowListByRfid(List<String> rfid);

    /**
     * 归还功能
     *
     * @param booksBorrowList 借阅集合
     * @return 借阅集合
     */
    boolean returnFunction(List<BooksJoinBorrowRecord> booksBorrowList);

    /**
     * 续借功能
     *
     * @param booksBorrow 借阅集合
     * @return 借阅集合
     */
    boolean renewalFunction(BooksJoinBorrowRecord booksBorrow);

    /**
     * 批量续借功能
     *
     * @param booksBorrows 借阅集合
     * @return 借阅集合
     */
    boolean renewalMultiFunction(List<BooksJoinBorrowRecord> booksBorrows);

    /**
     * 查询书籍借出待归还列表
     *
     * @return 借阅集合
     */
    List<BooksJoinBorrowRecord> selectBooksBorrowLendList(BooksJoinBorrowRecord booksJoinBorrowRecord);

    /**
     * 查询逾期（待归还）记录列表
     *
     * @return 逾期集合
     */
    List<BooksJoinBorrowRecord> selectBooksBorrowBeOverdueList(BooksJoinBorrowRecord booksJoinBorrowRecord);

    /** 查询逾期书籍数量 */
    Long selectBooksBorrowBeOverdueCount(BooksJoinBorrowRecord booksJoinBorrowRecord);

    /** 查询借阅书籍数量 */
    Long selectBooksBorrowBeLendCount(BooksJoinBorrowRecord booksJoinBorrowRecord);

    /**
     * 检查是否能够正常借出
     *  - 网络延迟实际上已经借出
     *  - 数据库已经软删除的数据
     * @param booksBorrowList 检查集合
     */
    void checkLend(List<BooksJoinBorrowRecord> booksBorrowList);

    /**
     * 检查是否能够正常归还
     *  - 网络延迟实际上已经归还
     *  - 数据库已经软删除的数据
     * @param booksBorrowList 检查集合
     */
    void checkReturn(List<BooksJoinBorrowRecord> booksBorrowList);

    /**
     * 检查是否能够正常续借 (续借次数)
     *  - 网络延迟实际上已经续借
     *  - 数据库已经软删除的数据
     * @param booksBorrows 检查集合
     */
    @Deprecated
    default void checkRenew(List<BooksJoinBorrowRecord> booksBorrows) {
    }

}
